Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / core / database / src / commonMain / kotlin / org / meshtastic / core / database / dao / SwitchingDiscoveryDao.kt

Displaying Raw • Download

core/database/src/commonMain/kotlin/org/meshtastic/core/database/dao/SwitchingDiscoveryDao.kt 41414f832f938b655c97bc07509bc140ea16e2a3 (41414f83) Text, 7.15 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.database.dao

Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787org.meshtastic.core.database.DatabaseProvider
Tff7b72import T7ee787org.meshtastic.core.database.entity.DiscoveredNodeEntity
Tff7b72import T7ee787org.meshtastic.core.database.entity.DiscoveryPresetResultEntity
Tff7b72import T7ee787org.meshtastic.core.database.entity.DiscoverySessionEntity

T8b949e/**
* A switch-aware [DiscoveryDao] that resolves the active database on every call instead of pinning the one that was
* current at injection time. This is what Koin hands to `feature:discovery` consumers (ViewModels and the scan engine),
* which hold their DAO for their whole lifetime:
* - Flow methods re-latch through [DatabaseProvider.observeCurrentDb], so an open discovery screen follows a device/DB
* switch and recovers from a wedged active Room pool.
* - Suspend methods go through [DatabaseProvider.withDb], so writes register with the cross-transport merge drain
* barrier (a mid-scan merge can't snapshot-then-retire the DB underneath an in-flight session write). A callback is
* never replayed after it starts, so higher layers must make any retry policy explicit where idempotency is known.
*
* `withDb` can return null while no database is available. Collection reads use empty defaults, count reads return
* zero, and operations that require a created row retain non-null checks so callers cannot proceed with an invalid id.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72class T56d364SwitchingDiscoveryDaoTb4b4b4(Tff7b72private Tff7b72val Te6edf3dbManagerTb4b4b4: Te6edf3DatabaseProviderTb4b4b4) Tb4b4b4: Te6edf3DiscoveryDao Tb4b4b4{

T8b949e// region Session operations

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffinsertSessionTb4b4b4(Te6edf3sessionTb4b4b4: Te6edf3DiscoverySessionEntityTb4b4b4)Tb4b4b4: Tffa657Long Tff7b72=
Te6edf3checkNotNullTb4b4b4(Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3insertSessionTb4b4b4(Te6edf3sessionTb4b4b4) Tb4b4b4}Tb4b4b4)

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupdateSessionTb4b4b4(Te6edf3sessionTb4b4b4: Te6edf3DiscoverySessionEntityTb4b4b4) Tb4b4b4{
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3updateSessionTb4b4b4(Te6edf3sessionTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffgetAllSessionsTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3ListTff7b72<Te6edf3DiscoverySessionEntityTff7b72>Tff7b72> Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3observeCurrentDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getAllSessionsTb4b4b4(Tb4b4b4) Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetAllSessionsSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DiscoverySessionEntityTff7b72> Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getAllSessionsSnapshotTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3orEmptyTb4b4b4(Tb4b4b4)

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetSessionTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Te6edf3DiscoverySessionEntity? Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getSessionTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupdateSessionCompletionStatusTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4, Te6edf3statusTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Int Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3updateSessionCompletionStatusTb4b4b4(Te6edf3sessionIdTb4b4b4, Te6edf3statusTb4b4b4) Tb4b4b4} Tff7b72?: T79c0ff0

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupdateSessionAggregatesTb4b4b4(
Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4,
Te6edf3totalUniqueNodesTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3totalDwellSecondsTb4b4b4: Tffa657LongTb4b4b4,
Te6edf3totalMessagesTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3totalSensorPacketsTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3furthestNodeDistanceTb4b4b4: Tffa657DoubleTb4b4b4,
Te6edf3avgChannelUtilizationTb4b4b4: Tffa657DoubleTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3updateSessionAggregatesTb4b4b4(
Te6edf3sessionIdTb4b4b4,
Te6edf3totalUniqueNodesTb4b4b4,
Te6edf3totalDwellSecondsTb4b4b4,
Te6edf3totalMessagesTb4b4b4,
Te6edf3totalSensorPacketsTb4b4b4,
Te6edf3furthestNodeDistanceTb4b4b4,
Te6edf3avgChannelUtilizationTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupdateRecoverableSessionCompletionStatusTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4, Te6edf3statusTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Int Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3updateRecoverableSessionCompletionStatusTb4b4b4(Te6edf3sessionIdTb4b4b4, Te6edf3statusTb4b4b4) Tb4b4b4} Tff7b72?: T79c0ff0

Tff7b72override Tff7b72fun Td2a8ffgetSessionFlowTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3DiscoverySessionEntity?Tff7b72> Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3observeCurrentDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getSessionFlowTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffdeleteSessionTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4) Tb4b4b4{
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3deleteSessionTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffmarkInterruptedSessionsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3markInterruptedSessionsTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetInterruptedSessionTb4b4b4(Te6edf3deviceAddressTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3DiscoverySessionEntity? Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getInterruptedSessionTb4b4b4(Te6edf3deviceAddressTb4b4b4) Tb4b4b4}

T8b949e// endregion

T8b949e// region Preset result operations

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffinsertPresetResultTb4b4b4(Te6edf3resultTb4b4b4: Te6edf3DiscoveryPresetResultEntityTb4b4b4)Tb4b4b4: Tffa657Long Tff7b72=
Te6edf3checkNotNullTb4b4b4(Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3insertPresetResultTb4b4b4(Te6edf3resultTb4b4b4) Tb4b4b4}Tb4b4b4)

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupdatePresetResultTb4b4b4(Te6edf3resultTb4b4b4: Te6edf3DiscoveryPresetResultEntityTb4b4b4) Tb4b4b4{
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3updatePresetResultTb4b4b4(Te6edf3resultTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetPresetResultsTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DiscoveryPresetResultEntityTff7b72> Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getPresetResultsTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3orEmptyTb4b4b4(Tb4b4b4)

Tff7b72override Tff7b72fun Td2a8ffgetPresetResultsFlowTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3ListTff7b72<Te6edf3DiscoveryPresetResultEntityTff7b72>Tff7b72> Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3observeCurrentDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getPresetResultsFlowTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4}

T8b949e// endregion

T8b949e// region Discovered node operations

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffinsertDiscoveredNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3DiscoveredNodeEntityTb4b4b4)Tb4b4b4: Tffa657Long Tff7b72=
Te6edf3checkNotNullTb4b4b4(Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3insertDiscoveredNodeTb4b4b4(Te6edf3nodeTb4b4b4) Tb4b4b4}Tb4b4b4)

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffinsertDiscoveredNodesTb4b4b4(Te6edf3nodesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DiscoveredNodeEntityTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3insertDiscoveredNodesTb4b4b4(Te6edf3nodesTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupdateDiscoveredNodeTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3DiscoveredNodeEntityTb4b4b4) Tb4b4b4{
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3updateDiscoveredNodeTb4b4b4(Te6edf3nodeTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetDiscoveredNodesTb4b4b4(Te6edf3presetResultIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DiscoveredNodeEntityTff7b72> Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getDiscoveredNodesTb4b4b4(Te6edf3presetResultIdTb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3orEmptyTb4b4b4(Tb4b4b4)

Tff7b72override Tff7b72fun Td2a8ffgetDiscoveredNodesFlowTb4b4b4(Te6edf3presetResultIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3ListTff7b72<Te6edf3DiscoveredNodeEntityTff7b72>Tff7b72> Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3observeCurrentDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getDiscoveredNodesFlowTb4b4b4(Te6edf3presetResultIdTb4b4b4) Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetUniqueNodeNumsTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Tffa657LongTff7b72> Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getUniqueNodeNumsTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3orEmptyTb4b4b4(Tb4b4b4)

T8b949e// endregion

T8b949e// region Aggregate queries

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetUniqueNodeCountTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Tffa657Int Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getUniqueNodeCountTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4} Tff7b72?: T79c0ff0

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetMaxDistanceTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Tffa657Double? Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getMaxDistanceTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetSessionWithResultsTb4b4b4(Te6edf3sessionIdTb4b4b4: Tffa657LongTb4b4b4)Tb4b4b4: Te6edf3DiscoverySessionEntity? Tff7b72=
Te6edf3dbManagerTb4b4b4.Te6edf3withDb Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3discoveryDaoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getSessionWithResultsTb4b4b4(Te6edf3sessionIdTb4b4b4) Tb4b4b4}

T8b949e// endregion
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.07s